package com.xteam.ecsystem.dao;

import org.hibernate.HibernateException;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;

import com.xteam.ecsystem.dao.page.Page;
import com.xteam.ecsystem.dao.page.PageObjectSet;

/**
 * 用于定义具有分页接口的分页方法
 * 所有分页结果集均以PageObjectSet对象返回
 * 
 * @author liuzhi
 * @param <T>
 */
public interface BasePageDao<T> {
	
	/**
	 * 按指定查询的条件集 分页查询对象的
	 * 
	 * @param <T>
	 * @param clazz
	 *            指定对象类型
	 * @param criterions
	 *            条件集
	 * @param page 分页信息对象
	 * @return 分页对象
	 * @see com.xuming.dao.BaseDao.Result
	 * @author yuanjie.wu
	 */
	public PageObjectSet<T> findToResult(Class<T> clazz, Criterion[] criterions, Page page) throws HibernateException;

	/**
	 * 按指定查询的条件集和排序集 分页查询指定对象的所有数据
	 * 
	 * @param <T>
	 * @param clazz
	 *            指定对象类型
	 * @param criterions
	 *            条件集
	 * @param orders
	 *            排序集
	 * @param page 分页信息对象
	 * @return
	 * @author yuanjie.wu
	 */
	public PageObjectSet<T> findToResult(Class<T> clazz, Criterion[] criterions, Order[] orders, Page page) throws HibernateException;

	/**
	 * 分页查询对象的数据
	 * 
	 * @param <T>
	 * @param clazz
	 *            指定对象类型
	 * @param page 分页信息对象
	 * @return
	 * @see com.xuming.dao.BaseDao.Result
	 * @author yuanjie.wu
	 */
	public PageObjectSet<T> findToResult(Class<T> clazz, Page page) throws HibernateException;
	
	/**
	 * HQL语句分页查询<br>
	 * eg:from User
	 * @param hql
	 *            HQL查询语句
	 * @param page 分页信息对象
	 * @return
	 * @throws HibernateException
	 */
	public PageObjectSet<T> query(String hql, Page page) throws HibernateException;
	/**
	 * 带查询条件HQL语句分页查询<br>
	 * eg:from User where username=? and password=?
	 * @param hql
	 *            HQL查询语句
	 * @param args
	 *            HQL值数组
	 * @param page 分页信息对象
	 * @return
	 * @throws HibernateException
	 */
	public PageObjectSet<T> query(String hql, Object[] args, Page page) throws HibernateException;

	/**
	 * 带查询条件HQL语句分页查询 <br>
	 * eg: from User where username=:username and password=:password
	 * @param hql
	 *            HQL查询语句
	 * @param params
	 *            HQL占位字符串数组
	 * @param args
	 *            HQL值数组
	 * @param page 分页信息对象
	 * @return
	 * @throws HibernateException
	 * @author yuanjie.wu
	 */
	public PageObjectSet<T> query(String hql, String[] params, Object[] args, Page page) throws HibernateException;
	
	
	/**
	 * SQL语句分页查询<br>
	 * @param <T> (Map, List, javaBean对象)
	 * @param clazz 指定返回类型
	 * @param sql	SQL查询语句
	 * @param page 分页信息对象
	 * @return
	 * @throws HibernateException
	 * @author yuanjie.wu
	 */
	public PageObjectSet<T> queryWithSQL(Class<T> clazz, String sql, Page page) throws HibernateException;
	
	/**
	 * 带查询条件SQL语句分页查询<br>
	 * eg: select * from 表名 where 字段1=? ...  and 字段n=params?;
	 * @param <T> (Map, List, javaBean对象)
	 * @param clazz 指定返回类型
	 * @param sql	SQL查询语句
	 * @param args	SQL值数组
	 * @param page 分页信息对象
	 * @return
	 * @throws HibernateException
	 * @author yuanjie.wu
	 */
	public PageObjectSet<T> queryWithSQL(Class<T> clazz, String sql, Object[] args, Page page) throws HibernateException;
	
	
	/**
	 * 带查询条件SQL语句分页查询<br>
	 * eg: select * from 表名 where 字段1=params[0]... and 字段n=params[n];
	 * @param <T> (Map, List, javaBean对象)
	 * @param clazz 指定返回类型
	 * @param sql	SQL查询语句
	 * @param params SQL占位字符串数组
	 * @param args	SQL值数组
	 * @param page 分页信息对象
	 * @return
	 * @throws HibernateException
	 * @author yuanjie.wu
	 */
	public PageObjectSet<T> queryWithSQL(Class<T> clazz, String sql, String[] params, Object[] args, Page page) throws HibernateException;


	/**
	 * 带查询条件HQL语句分页查询<br>
	 * eg:from User where username=? and password=?
     * author hasee
	 * @param countHQL HQL查询语句(用于统计返回记录数)
	 * @param hql HQL查询语句
	 * @param args HQL值数组
	 * @param first 开始记录序号
	 * @param max 结束记录序号
	 * @return
	 * @throws HibernateException
	 */
	public PageObjectSet<T> query(String countHQL, String hql, Object[] args, int first, int max) throws HibernateException;

}
